/*
 * MyTableModel.java
 *
 * Created on 2 de octubre de 2005, 04:04 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ig.formato.util;


//import com.hxtt.swing.util.TableSorter;
//import java.util.Hashtable;
import javax.swing.table.AbstractTableModel;
//import javax.swing.table.JTableHeader;

public class TableModelCE extends AbstractTableModel{
        private boolean     DEBUG=false;
        private boolean[]   editables=null;
        private String[]    estado=null;
        private String[]    estadoAnterior=null;
        private Object[][]  object;
        private String[] columnNames = null;
        private Object[][] data =null;
        private boolean delFisico=false;
        private Integer[] columnasDiferentes=new Integer[0];
        public TableModelCE(Object[][] object,String[] columnNames,boolean[] editables){
            this.editables=editables;
            this.columnNames=columnNames;
            if(object!=null)
                this.object=object;
            else
                this.object= new Object[0][columnNames.length];
            setData(this.object);
        }
        
        public boolean isDelFisico() {
            return delFisico;
        }
        
        public String[] getEstado() {
            return estado;
        }
        
        public void setData(Object[][] _data){
            if(_data!=null){
                data=new Object[_data.length][columnNames.length];
                for (int j = 0; j <columnNames.length; j++) {
                    for (int i = 0; i < _data.length; i++) {
                        this.data[i][j] = _data[i][j];
                    }
                }
                this.fireTableDataChanged();
            }            
        }
        
        
        private void copyEstadosNuevos(){
            estadoAnterior = new String[estado.length];
            for (int i = 0; i < estado.length; i++) {
                estadoAnterior[i]=estado[i];
            }
        }
        
        private void copyEstadosViejos(){
            for (int i = 0; i < estadoAnterior.length; i++){
                estado[i]=estadoAnterior[i];
            }
            copyEstadosNuevos();
        }
        
        
        //super.addTableModelListener()
        public int getColumnCount() {
            return columnNames.length;
        }
        
        public int getRowCount() {
            return data.length;
        }
        
        public String getColumnName(int col) {
            return columnNames[col];
        }
        
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
        
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
        
        public boolean isCellEditable(int row, int col) {
            if (editables[col]==true)
                return true;
            else
                return false;
            
        }
        
        public Object[][] getData() {
            return this.data;
        }
        public Object[][] getObjet() {
            return this.object;
        }
        public void setValueAt(Object value, int row, int col){
            
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                        + " to " + value
                        + " (an instance of "
                        + value.getClass() + ")");
                System.out.println("New value of data:");
                printDebugData();
            }
            boolean existe=false;
            for(int i=0 ;i < columnasDiferentes.length ; i++){
                if((columnasDiferentes[i].intValue()-1)==col){
                    for(int j=0 ;j < data.length ; j++){
                        if(data[j][col].toString().trim().equals(value.toString().trim()) && j!=row){
                            existe=true;
                            break;
                        }
                    }
                }
                if(existe)
                    break;
            }
            
            if(existe){
                data[row][col]="<Tipo Existente>";
            }else
                data[row][col] = value;
            
            setData(data);
            this.fireTableCellUpdated(0,0);
        }
        
        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();
            
            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
        }
        
        public synchronized void moverArriba(int row){
            Object[][] data_1=new Object[this.data.length][this.getColumnCount()];
            for (int i = 0; i < data_1.length; i++) {
                for (int j = 0; j < this.getColumnCount(); j++) {
                    data_1[i][j]=data[i][j];
                }
            }
            for (int i = 0; i < data_1.length; i++) {
                if(i==row){
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i-1][j]=data_1[i][j];
                    }
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i][j]=data_1[i-1][j];
                    }
                    ig.formato.dto.CaracterEspecialDTO obj=getHt().get(row);
                    ig.formato.dto.CaracterEspecialDTO obj1=getHt().get(row-1);
                    getHt().put(row,obj1);
                    getHt().put(row-1,obj);
                    break;
                }
            }
            this.fireTableDataChanged();
        }
        
        public synchronized void moverAbajo(int row){
            Object[][] data_1=new Object[this.data.length][this.getColumnCount()];
            for (int i = 0; i < data_1.length; i++) {
                for (int j = 0; j < this.getColumnCount(); j++) {
                    data_1[i][j]=data[i][j];
                }
            }
            for (int i = 0; i < data_1.length; i++) {
                if(i==row){
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i+1][j]=data_1[i][j];
                    }
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i][j]=data_1[i+1][j];
                    }
                    ig.formato.dto.CaracterEspecialDTO obj=getHt().get(row);
                    ig.formato.dto.CaracterEspecialDTO obj1=getHt().get(row+1);
                    getHt().put(row,obj1);
                    getHt().put(row+1,obj);
                    break;
                }
            }
            this.fireTableDataChanged();
        }
        private java.util.Hashtable<Integer,ig.formato.dto.CaracterEspecialDTO> ht=new java.util.Hashtable<Integer,ig.formato.dto.CaracterEspecialDTO>();
        public synchronized void nuevo() {
            Object[][] data_1=new Object[this.data.length+1][this.getColumnCount()];
            ig.formato.dto.CaracterEspecialDTO tr=new ig.formato.dto.CaracterEspecialDTO();
            tr.setCaracter("-");
            tr.setRemplazarpor("");
            for (int i = 0; i < data_1.length; i++) {
                for (int j = 0; j < this.getColumnCount(); j++) {
                    try{
                        data_1[i][j]=data[i][j];
                    }catch(Exception e){
                        tr.setOrden(i);
                        if(j==0)
                            data_1[i][j]=tr.getCaracter();
                        else
                            data_1[i][j]=tr.getRemplazarpor();
                    }
                }
            }
            this.data=data_1;
            getHt().put(tr.getOrden(),tr);
            this.fireTableDataChanged();
        }
        
        public synchronized void eliminar(int row) {
            Object[][] data_1=new Object[this.data.length-1][this.getColumnCount()];
            int x=-1;
            for (int i = 0; i < data.length; i++) {
                if(i!=row)
                    x++;
                for (int j = 0; j < this.getColumnCount(); j++) {
                    if(i!=row)
                        data_1[x][j]=data[i][j];
                }
            }
            this.data=data_1;
            getHt().remove(row);
            java.util.Hashtable<Integer, ig.formato.dto.CaracterEspecialDTO> newHt=new java.util.Hashtable<Integer, ig.formato.dto.CaracterEspecialDTO>();
            boolean okNull=false;
            for(int i=0;i<ht.size();i++){
                ig.formato.dto.CaracterEspecialDTO dto=ht.get(i);
                if(dto!=null && !okNull){
                    newHt.put(dto.getOrden(),dto);
                }else{
                    okNull=true;
                    dto=ht.get(i+1);
                    dto.setOrden(i);
                    newHt.put(dto.getOrden(),dto);
                }
//                System.out.println(newHt.get(i).getOrden()+" - "+newHt.get(i).getTipoRegistro());
            }
            this.ht=newHt;
            this.fireTableDataChanged();
        }
        
        public Integer[] getColumnasDiferentes() {
            return columnasDiferentes;
        }
        
        public void setColumnasDiferentes(Integer[] columnasDiferentes) {
            this.columnasDiferentes = columnasDiferentes;
        }
        
        public java.util.Hashtable<Integer, ig.formato.dto.CaracterEspecialDTO> getHt() {
            return ht;
        }
        
        public void setHt(java.util.Hashtable<Integer, ig.formato.dto.CaracterEspecialDTO> ht) {
            this.ht = ht;
        }
        
        private Object[][] getDataExcluir(int row) {
            Object[][] dataEx=new Object[this.data.length-1][this.columnNames.length];
            int ii=0;
            for(int i=0;i<data.length;i++){
                if(i!=row){
                    for(int j=0;j<columnNames.length;j++){
                        dataEx[ii][j]=data[i][j];
                    }
                    ii++;
                }
            }
            return dataEx;
        }
    }    
